@dxos/react-ui-editor 0.6.12-staging.e11e696 → 0.6.13-main.548ca8d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/lib/browser/{chunk-AZWYO7TE.mjs → chunk-CIQSMP7K.mjs} +3 -3
  2. package/dist/lib/browser/{chunk-AZWYO7TE.mjs.map → chunk-CIQSMP7K.mjs.map} +2 -2
  3. package/dist/lib/browser/index.mjs +80 -81
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/state/index.mjs +1 -1
  7. package/dist/lib/node/{chunk-5RSKGJRI.cjs → chunk-GZWIENFM.cjs} +6 -6
  8. package/dist/lib/node/{chunk-5RSKGJRI.cjs.map → chunk-GZWIENFM.cjs.map} +2 -2
  9. package/dist/lib/node/index.cjs +108 -108
  10. package/dist/lib/node/index.cjs.map +4 -4
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/state/index.cjs +7 -7
  13. package/dist/lib/node/state/index.cjs.map +1 -1
  14. package/dist/lib/node-esm/{chunk-RCIWLRIY.mjs → chunk-GP5RCZ3X.mjs} +3 -3
  15. package/dist/lib/node-esm/{chunk-RCIWLRIY.mjs.map → chunk-GP5RCZ3X.mjs.map} +2 -2
  16. package/dist/lib/node-esm/index.mjs +80 -81
  17. package/dist/lib/node-esm/index.mjs.map +4 -4
  18. package/dist/lib/node-esm/meta.json +1 -1
  19. package/dist/lib/node-esm/state/index.mjs +1 -1
  20. package/dist/types/src/extensions/comments.d.ts.map +1 -1
  21. package/dist/types/src/extensions/listener.d.ts +1 -0
  22. package/dist/types/src/extensions/listener.d.ts.map +1 -1
  23. package/dist/types/src/hooks/useTextEditor.d.ts.map +1 -1
  24. package/dist/types/src/state/state.d.ts +2 -2
  25. package/dist/types/src/state/state.d.ts.map +1 -1
  26. package/dist/types/src/util.d.ts +6 -0
  27. package/dist/types/src/util.d.ts.map +1 -1
  28. package/package.json +28 -24
  29. package/src/extensions/command/hint.ts +1 -1
  30. package/src/extensions/comments.ts +7 -2
  31. package/src/extensions/listener.ts +1 -0
  32. package/src/hooks/useTextEditor.ts +28 -30
  33. package/src/state/state.ts +6 -3
  34. package/src/util.ts +10 -0
@@ -80,7 +80,7 @@ var localStorageStateStoreAdapter = {
80
80
  localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state2));
81
81
  }
82
82
  };
83
- var createEditorStateTransaction = ({ scrollTo, selection }) => {
83
+ var createEditorStateTransaction = (state2, { scrollTo, selection }) => {
84
84
  return {
85
85
  selection,
86
86
  scrollIntoView: !scrollTo,
@@ -128,7 +128,7 @@ var state = ({ getState, setState } = {}) => {
128
128
  run: (view) => {
129
129
  const state2 = getState(view.state.facet(documentId));
130
130
  if (state2) {
131
- view.dispatch(createEditorStateTransaction(state2));
131
+ view.dispatch(createEditorStateTransaction(view.state, state2));
132
132
  }
133
133
  return true;
134
134
  }
@@ -145,4 +145,4 @@ export {
145
145
  createEditorStateTransaction,
146
146
  state
147
147
  };
148
- //# sourceMappingURL=chunk-AZWYO7TE.mjs.map
148
+ //# sourceMappingURL=chunk-CIQSMP7K.mjs.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/state/util.ts", "../../../src/state/cursor.ts", "../../../src/state/doc.ts", "../../../src/state/state.ts"],
4
- "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nexport const singleValueFacet = <I, O = I>(defaultValue?: O) =>\n Facet.define<I, O>({\n // Called immediately.\n combine: (providers) => {\n return (providers[0] ?? defaultValue) as O;\n },\n });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState } from '@codemirror/state';\n\nimport { type Range } from './types';\nimport { singleValueFacet } from './util';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = singleValueFacet(defaultCursorConverter);\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { singleValueFacet } from './util';\n\n/**\n * Currently edited document id as FQ string.\n */\nexport const documentId = singleValueFacet<string>();\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type Extension, Transaction, type TransactionSpec } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { documentId } from './doc';\n\nconst stateRestoreAnnotation = 'dxos.org/cm/state-restore';\n\nexport type EditorSelection = {\n anchor: number;\n head?: number;\n};\n\nexport type EditorSelectionState = {\n scrollTo?: number;\n selection?: EditorSelection;\n};\n\nexport type EditorStateOptions = {\n setState: (id: string, state: EditorSelectionState) => void;\n getState: (id: string) => EditorSelectionState | undefined;\n};\n\nconst keyPrefix = 'dxos.org/react-ui-editor/state';\nexport const localStorageStateStoreAdapter: EditorStateOptions = {\n getState: (id) => {\n invariant(id);\n const state = localStorage.getItem(`${keyPrefix}/${id}`);\n return state ? JSON.parse(state) : undefined;\n },\n\n setState: (id, state) => {\n invariant(id);\n localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));\n },\n};\n\nexport const createEditorStateTransaction = ({ scrollTo, selection }: EditorSelectionState): TransactionSpec => {\n return {\n selection,\n scrollIntoView: !scrollTo,\n effects: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined,\n annotations: Transaction.userEvent.of(stateRestoreAnnotation),\n };\n};\n\n/**\n * Track scrolling and selection state to be restored when switching to document.\n */\n// TODO(burdon): Rename.\nexport const state = ({ getState, setState }: Partial<EditorStateOptions> = {}): Extension => {\n const setStateDebounced = debounce(setState!, 1_000);\n\n return [\n // TODO(burdon): Track scrolling (currently only updates when cursor moves).\n // EditorView.domEventHandlers({\n // scroll: (event) => {\n // setStateDebounced(id, {});\n // },\n // }),\n EditorView.updateListener.of(({ view, transactions }) => {\n const id = view.state.facet(documentId);\n if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {\n return;\n }\n\n if (setState) {\n const { scrollTop } = view.scrollDOM;\n const pos = view.posAtCoords({ x: 0, y: scrollTop });\n if (pos !== null) {\n const { anchor, head } = view.state.selection.main;\n setStateDebounced(id, { scrollTo: pos, selection: { anchor, head } });\n }\n }\n }),\n getState &&\n keymap.of([\n {\n key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.\n run: (view) => {\n const state = getState(view.state.facet(documentId));\n if (state) {\n view.dispatch(createEditorStateTransaction(state));\n }\n return true;\n },\n },\n ]),\n ].filter(isNotFalsy);\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Facet } from '@codemirror/state';\n\nexport const singleValueFacet = <I, O = I>(defaultValue?: O) =>\n Facet.define<I, O>({\n // Called immediately.\n combine: (providers) => {\n return (providers[0] ?? defaultValue) as O;\n },\n });\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState } from '@codemirror/state';\n\nimport { type Range } from './types';\nimport { singleValueFacet } from './util';\n\n/**\n * Converts indexes into the text document into stable peer-independent cursors.\n *\n * See:\n * - https://automerge.org/automerge/api-docs/js/functions/next.getCursor.html\n * - https://github.com/yjs/yjs?tab=readme-ov-file#relative-positions\n *\n * @param {assoc} number Negative values will associate the cursor with the previous character\n * while positive - with the next one.\n */\nexport interface CursorConverter {\n toCursor(position: number, assoc?: -1 | 1 | undefined): string;\n fromCursor(cursor: string): number;\n}\n\nconst defaultCursorConverter: CursorConverter = {\n toCursor: (position) => position.toString(),\n fromCursor: (cursor) => parseInt(cursor),\n};\n\nexport class Cursor {\n static readonly converter = singleValueFacet(defaultCursorConverter);\n\n static readonly getCursorFromRange = (state: EditorState, range: Range) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const from = cursorConverter.toCursor(range.from);\n const to = cursorConverter.toCursor(range.to, -1);\n return [from, to].join(':');\n };\n\n static readonly getRangeFromCursor = (state: EditorState, cursor: string) => {\n const cursorConverter = state.facet(Cursor.converter);\n\n const parts = cursor.split(':');\n const from = cursorConverter.fromCursor(parts[0]);\n const to = cursorConverter.fromCursor(parts[1]);\n return from !== undefined && to !== undefined ? { from, to } : undefined;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { singleValueFacet } from './util';\n\n/**\n * Currently edited document id as FQ string.\n */\nexport const documentId = singleValueFacet<string>();\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type EditorState, type Extension, Transaction, type TransactionSpec } from '@codemirror/state';\nimport { EditorView, keymap } from '@codemirror/view';\n\nimport { debounce } from '@dxos/async';\nimport { invariant } from '@dxos/invariant';\nimport { isNotFalsy } from '@dxos/util';\n\nimport { documentId } from './doc';\n\nconst stateRestoreAnnotation = 'dxos.org/cm/state-restore';\n\nexport type EditorSelection = {\n anchor: number;\n head?: number;\n};\n\nexport type EditorSelectionState = {\n scrollTo?: number;\n selection?: EditorSelection;\n};\n\nexport type EditorStateOptions = {\n setState: (id: string, state: EditorSelectionState) => void;\n getState: (id: string) => EditorSelectionState | undefined;\n};\n\nconst keyPrefix = 'dxos.org/react-ui-editor/state';\nexport const localStorageStateStoreAdapter: EditorStateOptions = {\n getState: (id) => {\n invariant(id);\n const state = localStorage.getItem(`${keyPrefix}/${id}`);\n return state ? JSON.parse(state) : undefined;\n },\n\n setState: (id, state) => {\n invariant(id);\n localStorage.setItem(`${keyPrefix}/${id}`, JSON.stringify(state));\n },\n};\n\nexport const createEditorStateTransaction = (\n state: EditorState,\n { scrollTo, selection }: EditorSelectionState,\n): TransactionSpec => {\n return {\n selection,\n scrollIntoView: !scrollTo,\n effects: scrollTo ? EditorView.scrollIntoView(scrollTo, { yMargin: 96 }) : undefined,\n annotations: Transaction.userEvent.of(stateRestoreAnnotation),\n };\n};\n\n/**\n * Track scrolling and selection state to be restored when switching to document.\n */\n// TODO(burdon): Rename.\nexport const state = ({ getState, setState }: Partial<EditorStateOptions> = {}): Extension => {\n const setStateDebounced = debounce(setState!, 1_000);\n\n return [\n // TODO(burdon): Track scrolling (currently only updates when cursor moves).\n // EditorView.domEventHandlers({\n // scroll: (event) => {\n // setStateDebounced(id, {});\n // },\n // }),\n EditorView.updateListener.of(({ view, transactions }) => {\n const id = view.state.facet(documentId);\n if (!id || transactions.some((tr) => tr.isUserEvent(stateRestoreAnnotation))) {\n return;\n }\n\n if (setState) {\n const { scrollTop } = view.scrollDOM;\n const pos = view.posAtCoords({ x: 0, y: scrollTop });\n if (pos !== null) {\n const { anchor, head } = view.state.selection.main;\n setStateDebounced(id, { scrollTo: pos, selection: { anchor, head } });\n }\n }\n }),\n getState &&\n keymap.of([\n {\n key: 'ctrl-r', // TODO(burdon): Setting to jump back to selection.\n run: (view) => {\n const state = getState(view.state.facet(documentId));\n if (state) {\n view.dispatch(createEditorStateTransaction(view.state, state));\n }\n return true;\n },\n },\n ]),\n ].filter(isNotFalsy);\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["Facet", "singleValueFacet", "defaultValue", "Facet", "define", "combine", "providers", "defaultCursorConverter", "toCursor", "position", "toString", "fromCursor", "cursor", "parseInt", "Cursor", "converter", "singleValueFacet", "getCursorFromRange", "state", "range", "cursorConverter", "facet", "from", "to", "join", "getRangeFromCursor", "parts", "split", "undefined", "documentId", "singleValueFacet", "Transaction", "EditorView", "keymap", "debounce", "invariant", "isNotFalsy", "stateRestoreAnnotation", "keyPrefix", "localStorageStateStoreAdapter", "getState", "id", "invariant", "state", "localStorage", "getItem", "JSON", "parse", "undefined", "setState", "setItem", "stringify", "createEditorStateTransaction", "scrollTo", "selection", "scrollIntoView", "effects", "EditorView", "yMargin", "annotations", "Transaction", "userEvent", "of", "setStateDebounced", "debounce", "updateListener", "view", "transactions", "facet", "documentId", "some", "tr", "isUserEvent", "scrollTop", "scrollDOM", "pos", "posAtCoords", "x", "y", "anchor", "head", "main", "keymap", "key", "run", "dispatch", "filter", "isNotFalsy"]
7
7
  }
@@ -5,7 +5,7 @@ import {
5
5
  localStorageStateStoreAdapter,
6
6
  singleValueFacet,
7
7
  state
8
- } from "./chunk-AZWYO7TE.mjs";
8
+ } from "./chunk-CIQSMP7K.mjs";
9
9
 
10
10
  // packages/ui/react-ui-editor/src/translations.ts
11
11
  var translationKey = "react-ui-editor";
@@ -1237,6 +1237,51 @@ var clientRectsFor = (dom) => {
1237
1237
  }
1238
1238
  };
1239
1239
 
1240
+ // packages/ui/react-ui-editor/src/extensions/util/error.ts
1241
+ import { log as log3 } from "@dxos/log";
1242
+ var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/util/error.ts";
1243
+ var wrapWithCatch = (fn) => {
1244
+ return (...args) => {
1245
+ try {
1246
+ return fn(...args);
1247
+ } catch (err) {
1248
+ log3.catch(err, void 0, {
1249
+ F: __dxlog_file5,
1250
+ L: 12,
1251
+ S: void 0,
1252
+ C: (f, a) => f(...a)
1253
+ });
1254
+ }
1255
+ };
1256
+ };
1257
+
1258
+ // packages/ui/react-ui-editor/src/extensions/util/overlap.ts
1259
+ var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
1260
+
1261
+ // packages/ui/react-ui-editor/src/extensions/util/react.tsx
1262
+ import React from "react";
1263
+ import { createRoot } from "react-dom/client";
1264
+ import { ThemeProvider } from "@dxos/react-ui";
1265
+ import { defaultTx } from "@dxos/react-ui-theme";
1266
+ var createElement = (tag, options, children) => {
1267
+ const el = document.createElement(tag);
1268
+ if (options?.className) {
1269
+ el.className = options.className;
1270
+ }
1271
+ if (children) {
1272
+ el.append(...Array.isArray(children) ? children : [
1273
+ children
1274
+ ]);
1275
+ }
1276
+ return el;
1277
+ };
1278
+ var renderRoot = (root, node) => {
1279
+ createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
1280
+ tx: defaultTx
1281
+ }, node));
1282
+ return root;
1283
+ };
1284
+
1240
1285
  // packages/ui/react-ui-editor/src/extensions/command/hint.ts
1241
1286
  var CommandHint = class extends WidgetType2 {
1242
1287
  constructor(content) {
@@ -1327,51 +1372,6 @@ import { debounce } from "@dxos/async";
1327
1372
  import { log as log5 } from "@dxos/log";
1328
1373
  import { nonNullable } from "@dxos/util";
1329
1374
 
1330
- // packages/ui/react-ui-editor/src/extensions/util/error.ts
1331
- import { log as log3 } from "@dxos/log";
1332
- var __dxlog_file5 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/extensions/util/error.ts";
1333
- var wrapWithCatch = (fn) => {
1334
- return (...args) => {
1335
- try {
1336
- return fn(...args);
1337
- } catch (err) {
1338
- log3.catch(err, void 0, {
1339
- F: __dxlog_file5,
1340
- L: 12,
1341
- S: void 0,
1342
- C: (f, a) => f(...a)
1343
- });
1344
- }
1345
- };
1346
- };
1347
-
1348
- // packages/ui/react-ui-editor/src/extensions/util/overlap.ts
1349
- var overlap = (a, b) => a.from <= b.to && a.to >= b.from;
1350
-
1351
- // packages/ui/react-ui-editor/src/extensions/util/react.tsx
1352
- import React from "react";
1353
- import { createRoot } from "react-dom/client";
1354
- import { ThemeProvider } from "@dxos/react-ui";
1355
- import { defaultTx } from "@dxos/react-ui-theme";
1356
- var createElement = (tag, options, children) => {
1357
- const el = document.createElement(tag);
1358
- if (options?.className) {
1359
- el.className = options.className;
1360
- }
1361
- if (children) {
1362
- el.append(...Array.isArray(children) ? children : [
1363
- children
1364
- ]);
1365
- }
1366
- return el;
1367
- };
1368
- var renderRoot = (root, node) => {
1369
- createRoot(root).render(/* @__PURE__ */ React.createElement(ThemeProvider, {
1370
- tx: defaultTx
1371
- }, node));
1372
- return root;
1373
- };
1374
-
1375
1375
  // packages/ui/react-ui-editor/src/util.ts
1376
1376
  import { log as log4 } from "@dxos/log";
1377
1377
  var __dxlog_file6 = "/home/runner/work/dxos/dxos/packages/ui/react-ui-editor/src/util.ts";
@@ -1381,12 +1381,16 @@ var callbackWrapper = (fn) => (...args) => {
1381
1381
  } catch (err) {
1382
1382
  log4.catch(err, void 0, {
1383
1383
  F: __dxlog_file6,
1384
- L: 18,
1384
+ L: 19,
1385
1385
  S: void 0,
1386
1386
  C: (f, a) => f(...a)
1387
1387
  });
1388
1388
  }
1389
1389
  };
1390
+ var debugDispatcher = (trs, view) => {
1391
+ logChanges(trs);
1392
+ view.update(trs);
1393
+ };
1390
1394
  var logChanges = (trs) => {
1391
1395
  const changes = trs.flatMap((tr) => {
1392
1396
  if (tr.changes.empty) {
@@ -1407,7 +1411,7 @@ var logChanges = (trs) => {
1407
1411
  changes
1408
1412
  }, {
1409
1413
  F: __dxlog_file6,
1410
- L: 39,
1414
+ L: 49,
1411
1415
  S: void 0,
1412
1416
  C: (f, a) => f(...a)
1413
1417
  });
@@ -1799,8 +1803,11 @@ var scrollThreadIntoView = (view, id, center = true) => {
1799
1803
  }
1800
1804
  };
1801
1805
  var selectionOverlapsComment = (state2) => {
1806
+ const commentState = state2.field(commentsState, false);
1807
+ if (commentState === void 0) {
1808
+ return false;
1809
+ }
1802
1810
  const { selection } = state2;
1803
- const commentState = state2.field(commentsState);
1804
1811
  for (const range of selection.ranges) {
1805
1812
  if (commentState.comments.some(({ range: commentRange }) => overlap(commentRange, range))) {
1806
1813
  return true;
@@ -5232,7 +5239,6 @@ var instanceCount = 0;
5232
5239
  var useTextEditor = (props = {}, deps = []) => {
5233
5240
  const { id, initialValue, extensions, autoFocus, scrollTo, selection, moveToEndOfLine, debug } = useMemo3(() => getProviderValue(props), deps ?? []);
5234
5241
  const [instanceId] = useState4(() => `text-editor-${++instanceCount}`);
5235
- const onUpdate = useRef2();
5236
5242
  const [view, setView] = useState4();
5237
5243
  const parentRef = useRef2(null);
5238
5244
  useEffect3(() => {
@@ -5244,7 +5250,7 @@ var useTextEditor = (props = {}, deps = []) => {
5244
5250
  doc: initialValue?.length ?? 0
5245
5251
  }, {
5246
5252
  F: __dxlog_file11,
5247
- L: 78,
5253
+ L: 76,
5248
5254
  S: void 0,
5249
5255
  C: (f, a) => f(...a)
5250
5256
  });
@@ -5265,42 +5271,35 @@ var useTextEditor = (props = {}, deps = []) => {
5265
5271
  selection: initialSelection,
5266
5272
  extensions: [
5267
5273
  id && documentId.of(id),
5268
- // NOTE: Doesn't catch errors in keymap functions.
5274
+ extensions,
5275
+ // NOTE: This doesn't catch errors in keymap functions.
5269
5276
  EditorView18.exceptionSink.of((err) => {
5270
5277
  log8.catch(err, void 0, {
5271
5278
  F: __dxlog_file11,
5272
- L: 100,
5279
+ L: 98,
5273
5280
  S: void 0,
5274
5281
  C: (f, a) => f(...a)
5275
5282
  });
5276
- }),
5277
- extensions,
5278
- EditorView18.updateListener.of(() => {
5279
- setTimeout(() => {
5280
- onUpdate.current?.();
5281
- });
5282
5283
  })
5283
5284
  ].filter(isNotFalsy3)
5284
5285
  });
5285
5286
  view2 = new EditorView18({
5286
5287
  parent: parentRef.current,
5287
5288
  state: state2,
5288
- // NOTE: Uncomment to debug/monitor all transactions.
5289
- // https://codemirror.net/docs/ref/#view.EditorView.dispatch
5290
- dispatchTransactions: (trs, view3) => {
5291
- if (debug) {
5292
- logChanges(trs);
5293
- }
5294
- view3.update(trs);
5295
- }
5289
+ scrollTo: scrollTo ? EditorView18.scrollIntoView(scrollTo, {
5290
+ yMargin: 96
5291
+ }) : void 0,
5292
+ dispatchTransactions: debug ? debugDispatcher : void 0
5296
5293
  });
5297
- if (!initialValue && moveToEndOfLine) {
5294
+ if (moveToEndOfLine && !initialSelection) {
5298
5295
  const { to } = view2.state.doc.lineAt(0);
5299
- view2.dispatch({
5300
- selection: {
5301
- anchor: to
5302
- }
5303
- });
5296
+ if (to) {
5297
+ view2.dispatch({
5298
+ selection: {
5299
+ anchor: to
5300
+ }
5301
+ });
5302
+ }
5304
5303
  }
5305
5304
  setView(view2);
5306
5305
  }
@@ -5318,21 +5317,20 @@ var useTextEditor = (props = {}, deps = []) => {
5318
5317
  }, deps);
5319
5318
  useEffect3(() => {
5320
5319
  if (view) {
5321
- onUpdate.current = () => {
5322
- onUpdate.current = void 0;
5323
- view.dispatch(createEditorStateTransaction({
5320
+ if (view.state.facet(editorInputMode).noTabster) {
5321
+ parentRef.current?.removeAttribute("data-tabster");
5322
+ }
5323
+ if (scrollTo || selection) {
5324
+ view.dispatch(createEditorStateTransaction(view.state, {
5324
5325
  scrollTo,
5325
5326
  selection
5326
5327
  }));
5327
- };
5328
- if (view.state.facet(editorInputMode).noTabster) {
5329
- parentRef.current?.removeAttribute("data-tabster");
5330
5328
  }
5331
5329
  }
5332
5330
  }, [
5333
5331
  view,
5334
- selection,
5335
- scrollTo
5332
+ scrollTo,
5333
+ selection
5336
5334
  ]);
5337
5335
  useEffect3(() => {
5338
5336
  if (view && autoFocus) {
@@ -5403,6 +5401,7 @@ export {
5403
5401
  createExternalCommentSync,
5404
5402
  createMarkdownExtensions,
5405
5403
  createThemeExtensions,
5404
+ debugDispatcher,
5406
5405
  debugNodeLogger,
5407
5406
  debugTree,
5408
5407
  decorateMarkdown,